﻿#include <iostream>
#include "opencv2/opencv.hpp"

int main() {
    // 读取图像（灰度模式）
    cv::Mat src = cv::imread("src.PNG", cv::IMREAD_GRAYSCALE);
    if (src.empty()) {
        return -1;
    }

    cv::imshow("原图", src);

    // ----------- 1. 去竖条纹：频域滤波 ------------
    cv::Mat padded;
    int m = cv::getOptimalDFTSize(src.rows);
    int n = cv::getOptimalDFTSize(src.cols);
    cv::copyMakeBorder(src, padded, 0, m - src.rows, 0, n - src.cols, cv::BORDER_CONSTANT, cv::Scalar::all(0));

    cv::Mat planes[] = { cv::Mat_<float>(padded), cv::Mat::zeros(padded.size(), CV_32F) };
    cv::Mat complexI;
    cv::merge(planes, 2, complexI);
    cv::dft(complexI, complexI);

    // 构造频域掩膜，屏蔽竖向条纹（中频区域）
    int cx = complexI.cols / 2;
    int cy = complexI.rows / 2;
    int mask_width = 10;
    for (int y = 0; y < complexI.rows; y++) {
        for (int x = cx - mask_width; x < cx + mask_width; x++) {
            complexI.at<cv::Vec2f>(y, x) = cv::Vec2f(0, 0);
        }
    }

    // 反变换
    cv::idft(complexI, complexI);
    cv::split(complexI, planes);
    cv::magnitude(planes[0], planes[1], planes[0]);
    cv::normalize(planes[0], planes[0], 0, 255, cv::NORM_MINMAX);
    cv::Mat filtered;
    planes[0](cv::Rect(0, 0, src.cols, src.rows)).convertTo(filtered, CV_8U);
    cv::imshow("r1", filtered);

    // ----------- 2. 边缘增强（锐化） ------------
    cv::Mat sharpened;
    cv::Mat kernel = (cv::Mat_<float>(3,3) <<
         0, -1,  0,
        -1,  5, -1,
         0, -1,  0);
    cv::filter2D(filtered, sharpened, -1, kernel);
    cv::imshow("r2", sharpened);

    // ----------- 3. 均衡化直方图 ------------
    cv::Mat equalized;
    cv::equalizeHist(sharpened, equalized);
    cv::imshow("r3", equalized);

    // ----------- 4. 最终结果保存 ------------
    cv::imwrite("result.png", equalized);
    cv::imshow("r4", equalized);

    cv::waitKey(0);
    cv::destroyAllWindows();
    return 0;
}
